curl_easy_init()curl_easy_cleanup()

1 curl_easy_init()

 #include <curl/curl.h>

 CURL * curl_easy_init();

调用这个函数是使用libcurl发起http请求的第一步,在调用成功后,这个函数会返回一个“curl easy handle”,在往后的程序中,调用其他的curl easy接口都需要这个handle作为输入。在程序结束需要关闭的时候必须要调用curl_easy_cleanup()

在程序中curl_easy_init()curl_easy_cleanup()总是成对出现。

如果在之前的程序中,你并没有调用curl_global_init(),那么curl_easy_init()会在内部调用它。然而,由于curl_global_init()不是线程安全的,如果这种场景发生在多个线程同时调用curl_easy_init(),程序可能会发生资源泄露问题---由于curl_global_init()curl_global_cleanup()没有成对出现导致的。

因此,libcurl官方建议在合适的地方显式调用curl_global_init()curl_global_cleanup(),不要依靠curl_easy_init()来触发curl_global_init()

2 curl_easy_cleanup()

#include <curl/curl.h>

void curl_easy_cleanup(CURL * handle );

这个函数是和curl_easy_init()成对使用的,用来关闭一个“easy”会话(session),在调用时,需要传入需要关闭的“handle”即之前curl_easy_init()的返回值。

调用这个函数会关闭掉对应“handle”所打开的所有连接(除非这个连接被多个“handle”使用)。

因为不断地init和cleanup会对性能有一些影响。所以,有一个建议是:使用同一个“handle”来处理多个连接。

对于一些协议,如FTP,POP3以及IMAP,由于这些协议的实现细节---在关闭的过程中会有“req->resp->req->resp”这样的流程。在这些场景中,调用curl_easy_cleanup()会导致之前设置的一些回调函数被调用。